package com.jinyu.common.utils;



import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Author: yangli@elane.cn
 * @Despriction: 关于阿里fastjson的常用工具类
 * @Package: com.elane.document.utils
 * @Date:Created in 2022/4/29 15:01
 * @Modify By:
 */
public class FastJsonUtils {

    /**
     * 对象转JSON字符串
     * @param object 需要转换的对象
     * @return JSON字符串
     */
    public static String getBeanToJson(Object object) {
        return JSON.toJSONString(object);
    }

    /**
     * 把JSON数据转换成指定的java对象
     * @param jsonData JSON数据
     * @param clazz 指定的java对象
     * @return 指定的java对象
     */
    public static <T> T getJsonToBean(String jsonData, Class<T> clazz) {
        return JSON.parseObject(jsonData, clazz);
    }

    /**
     * 两个类之间值的转换 - 常用语DTO、VO、PO等之间的相互转换
     * 从object》》tClass
     * @param object 源对象
     * @param tClass 目标结果对象
     * @param <T> 指定的java对象
     * @return 指定的java对象
     */
    public static <T> T getObjectToClass(Object object, Class<T> tClass) {
        String json = getBeanToJson(object);
        return getJsonToBean(json, tClass);
    }

    /**
     * 把JSON数据转换成指定的java对象集合 - 方式1
     * @param jsonData JSON数据
     * @param clazz 指定的java对象
     * @param <T> 指定的java对象
     * @return List<T>
     */
    public static <T> List<T> getJsonToList(String jsonData, Class<T> clazz) {
        return JSON.parseArray(jsonData, clazz);
    }

    /**
     * 把JSON数据转换成指定的java对象集合 - 方式2
     * @param jsonData JSON数据
     * @param clazz 指定的java对象
     * @param <T> 指定的java对象
     * @return List<T>
     */
    public static <T> List<T> getJsonToList2(String jsonData, Class<T> clazz) {
        return JSON.parseObject(jsonData, new TypeReference<ArrayList<T>>() {});
    }

    /**
     * 把JSON数据转换成较为复杂的List<Map<String, Object>>
     * @param jsonData JSON数据
     * @return List<Map<String, Object>>
     */
    public static List<Map<String, Object>> getJsonToListMap(String jsonData) {
        return JSON.parseObject(jsonData, new TypeReference<List<Map<String, Object>>>() {
        });
    }

    /**
     * List<T> 转 json
     * 可用于数据库json格式数据的保存
     * @param list 集合数据源
     * @param <T> json字符串
     * @return
     */
    public static <T> String listToJson(List<T> list) {
        String jsons = JSON.toJSONString(list);
        return jsons;
    }

    /**
     * 把JSON数据转换为数组
     * @param jsonData JSON数据
     * @param clazz 指定对象
     * @param <T> 指定对象
     * @return 指定对象的数组 - Object[]
     */
    public static <T> Object[] getJsonToArray(String jsonData, Class<T> clazz) {
        return JSON.parseArray(jsonData, clazz).toArray();
    }

    /**
     * Map转对象
     * @param map 源数据map
     * @param clazz 指定对象
     * @param <T> 指定对象
     * @return 指定对象
     */
    public static <T> T mapToObject(Map map, Class<T> clazz) {
        String jsonData = FastJsonUtils.getBeanToJson(map);
        return JSON.parseObject(jsonData, clazz);
    }

    /**
     * 对象转Map
     * @param object 源对象
     * @return Map
     */
    public static Map getObjectToMap(Object object) {
        String jsonData = FastJsonUtils.getBeanToJson(object);
        return FastJsonUtils.getJsonToBean(jsonData,Map.class);
    }

    /**
     * JSON字符串转JSON对象
     * @param jsonData json字符串
     * @return JSON对象 - JSONObject
     */
    public static JSONObject getJsonStringToJSONObject(String jsonData) {
        return JSONObject.parseObject(jsonData);
    }

    /**
     * 对象转JSON对象
     * @param object java对象
     * @return JSON对象 - JSONObject
     */
    public static JSONObject getObjectToJSONObject(Object object) {
        return getJsonStringToJSONObject(getBeanToJson(object));
    }

    public static JSONArray getJsonStringToJSONArray(String jsonData) {
        return JSONArray.parseArray(jsonData);
    }
}
